坚持
  • 微信
当前位置:首页 > PYTHON >

序列

作者:管理员 时间:2026-06-06 阅读数: 362人阅读

一、序列基础

1. 序列定义

序列是连续内存空间的数据存储方式,内存中存放对象地址,而非数据值
Python序列包含:列表、元组、字符串;字典、集合不属于序列。

  • 可变序列:列表(可增删改)

  • 不可变序列:元组、字符串(不能修改元素)

二、列表 list【可变有序序列】

1. 列表特点

  1. 可存储任意数量、任意类型数据

  2. 长度可变,自动扩容缩容

  3. 存储元素是各个对象的内存地址

2. 四种创建方式

# 1. []直接创建
a = [10,20,"abc",True]
empty = []

# 2. list()转换可迭代对象
b = list() #空列表
b1 = list(range(10)) # [0,1,2...9]
b2 = list("hello") # ['h','e','l','l','o']

#3. range生成连续整数,配合list
# 格式:range(start,end,step),左闭右开
c = list(range(3,71,10))

#4. 列表推导式
a = [x*2 for x in range(100) if x%9==0]
# 结果:[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]

3. 列表元素新增5种方法

方法说明是否生成新列表推荐度
append(x)尾部追加单个元素原地修改,不新建⭐⭐⭐⭐⭐
extend(alist)尾部拼接另一个列表所有元素原地修改,不新建⭐⭐⭐⭐
insert(index,x)指定索引插入元素,后续元素后移原地修改,不新建少用
+列表拼接生成新列表大数据不推荐
*列表重复扩展生成新列表适合初始化
#示例
lst = [20,40]
lst.append(80) # [20,40,80]
lst.extend([50,60]) # [20,40,80,50,60]
lst.insert(2,100) # [20,40,100,80,50,60]
new_lst = lst + [99] #新列表
mul_lst = [10]*3 # [10,10,10]

4. 列表删除元素

  1. del lst[index]:删除指定索引元素

  2. pop(index):删除并返回元素,默认删最后一位

  3. remove(x):删除第1个匹配元素,无元素则报错

  4. clear():清空列表内所有元素,保留列表对象

a = [10,20,30,40,50]
del a[2]
res = a.pop() #删除50
res2 = a.pop(1) #删除20
a.remove(30)
a.clear()

5. 元素访问与统计

  1. 索引访问lst[下标],下标越界报错

  2. index(x,start,end):查找元素首 次出现下标,可限定查找区间

  3. count(x):统计元素出现次数

  4. len(lst):获取列表长度

  5. / not:成员判断

arr = [10,20,30,20]
print(arr.index(20)) #1
print(arr.count(20)) #2
print(20 in arr) #True

6. 切片 [start:end:step](左闭右开)

arr = [10,20,30,40,50,60,70]
arr[:]      #全列表
arr[1:]     #从索引1到末尾
arr[:3]     #0~2索引
arr[1:6:2]  #[20,40,60]
arr[-3:]    #倒数3个 [50,60,70]
arr[::-1]   #列表反转

7. 列表排序

#1. list.sort():原地修改,无返回值
lst = [20,10,40,30]
lst.sort() #升序
lst.sort(reverse=True) #降序

#2. sorted(列表):返回新列表,原列表不变
new = sorted(lst)
new_desc = sorted(lst,reverse=True)

#3. reversed():返回迭代器,不修改原列表
rev = reversed(lst)
list(rev)

8. 列表复制

list1 = [30,40,50]
list2 = list1 #浅引用,指向同一对象
list3 = [] + list1 #创建全新列表

9. 二维列表

#存储表格:姓名、年龄、薪资、城市
table = [
    ["高小一",18,30000,"北京"],
    ["高小二",19,20000,"上海"],
    ["高小五",20,10000,"深圳"]
]
#取值:深圳
print(table[2][3])

#嵌套循环遍历全表
for row in table:
    for col in row:
        print(col,end="\t")
    print()

三、元组 tuple【不可变有序序列】

1. 元组特点

  1. 不可变:不能增删改元素,无append/remove等方法

  2. 访问速度优于列表;可作为字典的key,列表不能

  3. 单元素必须加逗号:(5,)(5)是int整数

2. 创建方式

#1. ()/直接逗号
t1 = (10,20,30)
t2 = 10,20,30
single = (5,)

#2. tuple()转换可迭代对象
t3 = tuple([1,2,3])
t4 = tuple(range(3))
t5 = tuple("abc")

3. 常用操作

索引、切片、index/count/len/max/min/sum和列表一致;排序只能用sorted(元组)返回新列表。

t = (20,10,30)
new = sorted(t) # [10,20,30]

4. zip打包

多个可迭代对象按位置打包成元组,长度以最短序列为准

a=[10,20,30]
b=[40,50,60]
res = list(zip(a,b)) #[(10,40),(20,50),(30,60)]

5. 生成器推导式

(表达式 for x in 可迭代对象) → 返回生成器对象,仅能遍历一次

gen = (x*2 for x in range(5))
t = tuple(gen) #(0,2,4,6,8)
t2 = tuple(gen) #() 生成器用完清空

列表&元组异同

相同点

  1. 有序序列,支持索引、切片、成员运算、count/len

  2. 均可存放任意数据类型,支持拆包赋值

不同点

  1. 列表可变(增删改),元组不可变

  2. 列表不能做字典键,元组可以

  3. 元组占用内存更小、查询更快

四、字典 dict【无序可变键值对,非序列】

1. 字典规则

  • key:不可变类型(数字、字符串、元组),维一不可重复

  • value:任意数据类型,可重复

2. 四种创建方式

#1. {}创建
d1 = {"name":"gaoqi","age":18}

#2. dict关键字创建
d2 = dict(name="gaoqi",age=18)

#3. zip拼接键值
keys = ["name","age","job"]
vals = ["gaoqi",18,"teacher"]
d3 = dict(zip(keys,vals))

#4. fromkeys:批量建key,默认值None
d4 = dict.fromkeys(["name","age"])

cost = {"支出金额":300.15,"支出日期":"2018.10.18","支出人":"高小七"}

3. 字典取值

d = {"name":"gaoqi","age":18}
#方式1:[],键不存在报错
print(d["name"])
#方式2:get(),推荐,无键返回自定义默认值
print(d.get("gender","不存在"))

#获取所有键/值/键值对
d.keys()
d.values()
d.items()
#成员判断:判断key是否存在
print("name" in d)

4. 字典增删改

d = {"name":"gaoqi","age":18}
#新增/修改:key存在则覆盖,不存在新增
d["address"] = "北京"
d["age"] = 20

#update:批量合并字典,重复key覆盖
d.update({"money":1000})

#删除
del d["name"]
age = d.pop("age") #删除并返回值
item = d.popitem() #随机删除一组键值对
d.clear() #清空

5. 序列解包

d = {"name":"gaoqi","age":18,"job":"teacher"}
#默认解包key
k1,k2,k3 = d
#解包value
v1,v2,v3 = d.values()
#解包键值对
i1,i2,i3 = d.items()

6. 字典嵌套列表表格

row1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"}
row2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"}
row3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"}
table = [row1,row2,row3]

#查询第二个人薪资
print(table[1].get("salary"))
#遍历全部薪资
for row in table:
    print(row["salary"])
#遍历整张表格所有数据
for info in table:
    print(info["name"],info["age"],info["salary"],info["city"])

7. 字典底层原理

  1. 底层依托散列表(稀疏数组bucket),每个bucket存key地址+value地址

  2. 存数据:hash(key)计算哈希值→取后N位做数组下标→空位存入,拥挤则顺延查找空位

  3. 查数据:同哈希算法找下标,比对hash值匹配则返回value

  4. 扩容:数组填充接近2/3自动扩容,空间换时间,查询速度极快

五、集合 set【无序可变,元素维一,非序列】

1. 集合与字典关系

集合底层基于字典实现,集合元素等同于字典的key,因此元素不可重复、必须是不可变数据

2. 创建与增删

#创建
s = {3,5,7}
#列表转集合(自动去重)
s2 = set(["a","b","b","c"]) # {'a','b','c'}

#新增
s.add(9)
#删除
s.remove(5)
s.clear()

3. 集合运算(数学集合)

a = {1,3,"sxt"}
b = {"he","it","sxt"}
#并集 | / union()
print(a | b)
#交集 & / intersection()
print(a & b)
#差集 - / difference()
print(a - b)

六、代码汇总

#1.range生成[30,40,50,60,70,80]
res = list(range(30,90,10))

#2.列表推导式
arr = [x*2 for x in range(100) if x%9==0]

#3.支出字典
pay_info = {"支出金额":300.15,"支出日期":"2018.10.18","支出人":"高小七"}

七、内存示意图文字描述

1. a = [100,200,300]

100、200、300分别是int对象,各拥有独立内存地址;
列表a的连续内存空间只存储三个整数对象的内存地址,不存实际数值。

2. 字典存入键值对底层

  1. 创建空字典,底层生成长度为N的稀疏数组(bucket);

  2. 对key执行hash()得到哈希数字;

  3. 截取哈希值末尾二进制换算数组下标;

  4. 下标对应bucket为空,存入key地址、value地址;若被占用,顺延哈希偏移寻找空位;

  5. 数组填充超过2/3阈值,自动扩容生成更大散列表,迁移原有数据。


上一篇:

下一篇: